<html>
    <head>
        <title>静态JavaScript Api 客户端代理</title>
    </head>
    <body>
        <script>
            // 静态JavaScript Api 客户端代理

                    /*
                            通常从JavaScript代码中使用HTTP API。

                            此，您通常处理低级AJAX调用，例如$. ajax或更好的abp.ajax。


                            ABP提供了一种更好的方法从JavaScript代码调用HTTP API：JavaScript API客户端代理！
                    */

                    /*
                        一、静态代理 与 动态代理

                                ABP提供了两种类型的客户端代理生成系统。
                                
                                本文档解释了静态客户端代理，它在您的开发时间生成客户端代码。
                                
                                您还可以查看动态JavaScript API客户端代理留档以了解如何使用运行时生成的代理。

                                开发时（静态）客户端代理生成有一点性能优势，因为它不需要在运行时获取HTTP API定义。
                                
                                但是，每当您更改API端点定义时，您应该重新生成客户端代理代码。
                                
                                另一方面，动态客户端代理是在运行时生成的，它提供了更简单的开发体验。
                    */

                    /*
                        二、一个简单的例子

                               1、声明服务接口

                                            假设您有一个定义如下所示的应用程序服务：

                                                    using System;
                                                    using System.Threading.Tasks;
                                                    using Volo.Abp.Application.Dtos;
                                                    using Volo.Abp.Application.Services;

                                                    namespace Acme.BookStore.Authors
                                                    {
                                                        public interface IAuthorAppService : IApplicationService
                                                        {
                                                            Task<AuthorDto> GetAsync(Guid id);

                                                            Task<PagedResultDto<AuthorDto>> GetListAsync(GetAuthorListDto input);

                                                            Task<AuthorDto> CreateAsync(CreateAuthorDto input);

                                                            Task UpdateAsync(Guid id, UpdateAuthorDto input);

                                                            Task DeleteAsync(Guid id);
                                                        }
                                                    }  

                                2、生成代理代码：  Generating the JavaScript Code 

                                            服务器端必须在生成客户端代理代码时启动并运行。

                                            因此，首先运行托管HTTP API的应用程序（可以是Web应用程序或HttpApi.Host应用程序，具体取决于您的解决方案结构）。

                                            在Web项目的根文件夹（.csproj）中打开命令行终端并键入以下命令：

                                                    " abp generate-proxy -t js -u https://localhost:53929/ "


                                            此命令应在ClientProxies文件夹下生成以下文件：

                                                                
                                                    "wwwroot/client-proxies/app-proxy.js"

                                            app-proxy.js是本例中生成的代理文件。这里，这个文件中的一个示例代理函数：
                                                            
                                                    acme.bookStore.authors.author.get = function(id, ajaxParams) {
                                                        return abp.ajax($.extend(true, {
                                                            url: abp.appPath + 'api/app/author/' + id + '',
                                                            type: 'GET'
                                                        }, ajaxParams));
                                                    };

                                            
                                            备注： generate-proxy命令仅为您在应用程序中定义的API生成代理（假定app作为模块名称）。
                                            
                                                  如果您正在开发模块化应用程序，您可以指定-m（或--module）参数来指定您要生成代理的模块。
                                                  
                                                  有关其他选项，请参阅ABP CLI留档中的Generate-proxy部分。


                                3、使用代理函数 Using the Proxy Functions 

                                            要使用代理函数，首先将app-proxy.js文件导入您的页面：

                                                  <abp-script src="/client-proxies/app-proxy.js"/>
                                                  
                                            在此示例中，我们使用了abp-script标签助手。
                                            
                                            您可以使用标准的script标记，但abp-script是将JavaScript文件导入页面的推荐方法。  
                                            
                                            现在，您可以从JavaScript代码中调用任何应用程序服务方法，就像调用JavaScript函数一样。

                                            JavaScript函数具有与C#方法相同的函数name、参数和返回值。

                                            eg:  获取单个作者

                                                 acme.bookStore.authors.author
                                                                        .get("7245a066-5457-4941-8aa7-3004778775f0") // 从某处获取ID
                                                                        .then(function(result){
                                                                            console.log(result);
                                                                        });

                                            eg: 获取作者列表

                                                   acme.bookStore.authors.author.getList({
                                                                                        maxResultCount: 10
                                                                                    }).then(function(result){
                                                                                        console.log(result.items);
                                                                                    });

                                            eg: 删除作者

                                                    acme.bookStore.authors.author
                                                                            .delete('7245a066-5457-4941-8aa7-3004778775f0') //Get id from somewhere!
                                                                            .then(function() {
                                                                                abp.notify.info('Successfully deleted!');
                                                                            });
                    */

                    /*
                         三、禁用动态JavaScript代理

                                    创建应用程序或模块时，默认使用动态客户端代理生成方法。

                                    如果您想为您的应用程序使用静态生成的客户端代理，
                                    
                                    您应该在模块类的ConfigureServices方法中为您的应用程序或模块显式禁用它，如下例所示：

                                            Configure<DynamicJavaScriptProxyOptions>(options =>
                                            {
                                                options.DisableModule("app");
                                            });

                                    app代表此示例中的主应用程序，如果您正在创建应用程序，它可以工作。
                                
                                    如果您正在开发应用程序模块，请使用您的模块名称。
                    */

                    /*
                        四、Ajax 详细信息

                                  JavaScript客户端代理函数在后台使用abp. ajax。因此，您具有与自动错误处理相同的好处。此外，您可以通过提供选项来完全控制AJAX调用。

                                  1、返回值

                                           每个函数都返回一个Deferred对象。
                                           
                                           这意味着您可以使用then链接以获取结果，catch来处理错误，always在操作完成（成功或失败）后执行操作。    
                                           
                                           
                                  2、AJAX Options AJAX选项

                                           每个函数在您自己的参数之后都会获得一个额外的last参数。
                                           
                                           最后一个参数被称为ajaxParams。它是一个覆盖AJAX选项的对象。
                                           
                                                   acme.bookStore.authors.author
                                                                        .delete('7245a066-5457-4941-8aa7-3004778775f0', {
                                                                            type: 'POST',
                                                                            dataType: 'xml'
                                                                        })
                                                                        .then(function() {
                                                                            abp.notify.info('Successfully deleted!');
                                                                        });

                                            有关所有可用选项，请参阅jQuery. ajax文档： https://api.jquery.com/jQuery.ajax/ 
                    */
        </script>
    </body>
</html>